# ============================================================
# * Copyright © hk. 2022-2025. All rights reserved.
# * File name: CMakeLists.txt
# * Author   : 苏木
# * Date     : 2025-05-22
# * Version  : 
# * Description: cmake version 3.16.3
# ============================================================
## https://cmake.com.cn/cmake/help/latest/guide/tutorial/index.html
## https://cmake.org/cmake/help/latest/

# 指定 CMake 的最低版本要求
# --------------------------------------------------
cmake_minimum_required(VERSION 3.10)


# 设置项目名称和使用的编程语言
# --------------------------------------------------
project(SPROJECT C)


# 指定可执行程序和源文件
# --------------------------------------------------
add_executable(app_demo.out main.c)

# Macro是CMake中的一种宏定义，可以将一些常用的代码片段定义为一个宏，当需要使用时直接调用宏即可，可以减少代码的重复性，提高代码的可读性和可维护性。
# --------------------------------------------------
# 需要知道的是macro中定义的变量在整个CMakeLists.txt文件中有效。
# macro(name [arg1 [arg2 [...]]])
#  # Macro body (i.e. commands) ...
# endmacro()

# 1. 宏参数是字符串替换项，因此无论使用什么作为宏调用的参数，基本上都会粘贴到宏主体中的参数中。
#    如果在if()语句中使用宏参数，那么参数将视为字符串而不是变量。
#    对于宏类似于字符串替换。该参数的值可以在宏体中使用通常的变量符号访问。
message(STATUS "==> macro")
macro(macr arg)
 if(DEFINED arg)
     message("Macro arg is a defined variable!arg=${arg}")
 else()
     message("Macro arg is NOT a defined variable!arg=${arg}")
 endif()
endmacro()

# Called like so:
macr(abc)
message("")

# 2. 宏也有ARGC ARGV ARGN的参数
message(STATUS "==> macro ARGC and ARGV and ARGN")
macro(macro_print_arg param1 param2)
	message(STATUS "Hello from inside a Macro!ARGC=${ARGC} ARGV=${ARGV} ARGN=${ARGN}")
	message(STATUS "All done")
endmacro()
# Called like so:
macro_print_arg(123 a b c) # ARGC=4 ARGV=123;a;b;c ARGN=b;c
message("")

# 3. 宏与调用者共享相同的变量作用域。所以宏里面可以直接修改调用者中的变量
message(STATUS "==> 作用域demo")
macro(dangerous_macro)
    set(result "MODIFIED")  # 会污染调用者的作用域
endmacro()
function(safe_function)
    set(result "ORIGINAL")
    dangerous_macro()
    message(STATUS "宏替换后的结果: ${result}")  # 输出: MODIFIED
endfunction()

safe_function()
message("")